#define u32 unsigned int
#define u8 unsigned char
#define u16 unsigned short

/* output byte */
void outb(u32 ad,u8 v){
	__asm__("outb %%al, %%dx" :: "d" (ad), "a" (v));
}
/* output word */
void outw(u32 ad,u16 v){
	__asm__("outw %%ax, %%dx" :: "d" (ad), "a" (v));
}
/* output word */
void outl(u32 ad,u32 v){
	__asm__("outl %%eax, %%dx" : : "d" (ad), "a" (v));
}

u8 inb(u32 ad){
	u8 _v;       \
	__asm__("inb %%dx, %%al" : "=a" (_v) : "d" (ad)); \
	return _v;
}
/* input word */
u16	inw(u32 ad){
	u16 _v;			\
	__asm__("inw %%dx, %%ax" : "=a" (_v) : "d" (ad));	\
	return _v;
}
/* input word */
u32	inl(u32 ad){
	u32 _v;			\
	__asm__("inl %%dx, %%eax" : "=a" (_v) : "d" (ad));	\
	return _v;
}

// void printhex(unsigned short num)
// {
// 	__asm__("movw %ss,%ax");
// 	__asm__("movw %ax,%ds");
// 	char buf[10] = {0};
// 	buf[0] = '0';
// 	buf[1] = 'x';
// 	unsigned char tmp = (unsigned char)((num&0xf000)>>12);
// 	if(tmp<10)
// 		tmp+='0';
// 	else
// 		tmp = tmp%10 + 'A';
// 	buf[2] = tmp;

// 	tmp = (num&0x0f00)>>8;
// 	if(tmp<10)
// 		tmp+='0';
// 	else
// 		tmp = tmp%10 + 'A';
// 	buf[3] = tmp;

// 	tmp = (unsigned char)(num&0x00f0)>>4;
// 	if(tmp<10)
// 		tmp+='0';
// 	else
// 		tmp = tmp%10 + 'A';
// 	buf[4] = tmp;

// 	tmp = (unsigned char)(num&0x000f);
// 	if(tmp<10)
// 		tmp+='0';
// 	else
// 		tmp = tmp%10 + 'A';
// 	buf[5] = tmp;
// 	unsigned char s=0;
// 	unsigned char index = 0;
// 	while(buf[index]!= 0){
// 		s = buf[index];
// 		__asm__("movw $0xb800,%ax");
// 		__asm__("movw %ax,%ds");
// 		*pDis++ = s;
// 		*pDis++ = 0x07;
// 		index++;
// 		__asm__("movw %ss,%ax");
// 		__asm__("movw %ax,%ds");
// 	}
// }

// void printstr(char *str)
// {
// 	unsigned char s=0;
// 	__asm__("movw $0x1000,%ax");//这样使用是因为，cpu在访问pDis和str时，都会使用ds段寄存器，而ds在开始设置成了0xb800，导致在取str时，地址变了,所以需要改变ds
// 	__asm__("movw %ax,%ds");
// 	__asm__("movw $0xb800,%ax");
// 	__asm__("movw %ax,%ds");
// 	*pDis++ = '9';
// 	*pDis++ = 0x07;
// 	while(*str!= 0){
// 		s = *str;
// 		__asm__("movw $0xb800,%ax");
// 		__asm__("movw %ax,%ds");
// 		if(s == '\n') {
// 			pDis = pDis + (160 - ((unsigned int)pDis)%160);
// 		}
// 		else {
// 			*pDis++ = s;
// 			*pDis++ = 0x07;
// 		}
// 		str++;
// 		__asm__("movw $0x1000,%ax");
// 		__asm__("movw %ax,%ds");
// 	}
// }

void __start()
{
	char *pDis = (char *)0xb8000;
	*pDis = 0x35;
	//printstr("helloworld");
	//printhex(0x1234);
	while(1);
}
